/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package familytree.persistencia.dao.hibernate;

import familytree.persistencia.dao.AlbumDAO;
import familytree.persistencia.pojos.Album;
import familytree.persistencia.pojos.Imagen;
import familytree.persistencia.pojos.Usuario;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.SQLQuery;
import org.hibernate.Transaction;

/**
 *
 * @author Antonio
 */
public class HibernateAlbumDAO extends HibernateGenericDAO<Album,String> implements AlbumDAO   {

    
    public List<Album> getAlbumByName(String name, String idArbol) {
        getSession().beginTransaction();
        String sql = "SELECT al.* FROM (((Album al INNER JOIN Usuario us ON us.idUsuario = al.idUsuario) ";
        sql += " INNER JOIN Nodo n ON us.idUsuario = n.idUsuario) ";
        sql += " INNER JOIN arbol ar ON ar.idArbol = n.idArbol)";
        sql += " WHERE ar.idArbol = :idarbol AND al.nombre = :name ";
        
        SQLQuery query = getSession().createSQLQuery(sql);
        query.addEntity(Album.class);
        query.setString("name", name);
        query.setString("idarbol", idArbol);
        List<Album> lista = new ArrayList<Album>();
        lista = query.list();
        return lista;
    }

    public void insertAlbum(Album album, String idUsuario) {
        
        Transaction tx = getSession().beginTransaction();
        try{
            Usuario user = (Usuario)getSession().load(Usuario.class, idUsuario);
            album.setUsuario(user);
            makePersistent(album);            
            user.getAlbumes().add(album);
            tx.commit();
            
            
        }
        catch(HibernateException he){
            tx.rollback();
        }
        
    }

    public List<Album> getAlbumByFamily(String idArbol) {
        getSession().beginTransaction();
        String sql = "SELECT al.* FROM (((Album al INNER JOIN Usuario us ON us.idUsuario = al.idUsuario) ";
        sql += " INNER JOIN Nodo n ON us.idUsuario = n.idUsuario) ";
        sql += " INNER JOIN arbol ar ON ar.idArbol = n.idArbol)";
        sql += " WHERE ar.idArbol = :idarbol";
        sql += " ORDER BY al.fecha ASC";
        
        SQLQuery query = getSession().createSQLQuery(sql);
        query.addEntity(Album.class);
        query.setString("idarbol", idArbol);
        List<Album> lista = new ArrayList<Album>();
        lista = query.list();
        return lista;
    }

    public void addImagen(Imagen imagen, Album album, byte[] arrayImagen , Usuario usuario) {
        Transaction trans = getSession().beginTransaction();
        try{
            imagen.setImagenBlob(Hibernate.createBlob(arrayImagen));
            Usuario user = (Usuario) getSession().load(Usuario.class, usuario.getIdUsuario());
            Album ab = (Album) getSession().load(Album.class, album.getIdAlbum());
            imagen.setAlbum(ab);
            imagen.setUsuario(user);
            getSession().save(imagen);
            ab.getImagenes().add(imagen);
            user.getImagenes().add(imagen);
            trans.commit();            
        }
        catch(HibernateException he){
            trans.rollback();
        }
    }

    
}
